package com.bbcare.comm;

import org.apache.commons.logging.*;

/*
 * @name:         系统级异常
 * @author:       DemonLee
 * @createTime:   2017.4.14
 * @description:  系统级错误信息
 * @modify:
 * 
 */
public class SysException extends BaseException {

    private Log logger = LogFactory.getLog(SysException.class);
    private static final long serialVersionUID = 1L;

    /**
     * SysException的跟踪调试信息，一般包括类名和方法名。
     */
    private String trace = "";

    public SysException() {
    }

    /**
     * 构造函数。根据错误号、程序指定错误信息、原发错误对象构造。 如：
     * 
     * @param errId
     *            错误号
     * @param errMsg
     *            程序中动态指定的错误信息
     * @param oriEx
     *            原发错误对象
     */

    public SysException(String errId, String errOwnMsg, Exception oriEx) {
        super(oriEx);
        this.errId = errId;
        this.errMsg = "系统处理异常: [" + errOwnMsg + "]";
        this.errMsgOri = oriEx.getMessage();
        this.errOri = oriEx;
        this.writeSysException();
    }

    /**
     * 构造函数。根据错误号、原发错误对象构造。 如：
     * 
     * @param errId
     *            错误号
     * @param oriEx
     *            原发错误对象
     */

    public SysException(String errId, Exception oriEx) {
        super(oriEx);
        this.errId = errId;
        this.errMsg = "系统处理异常: [" + oriEx.getMessage() + "]";
        this.errOri = oriEx;
        this.writeSysException();
    }

    /**
     * 添加跟踪信息，只有捕捉到SysException的时候才调用该函数。
     * 
     * @param msg
     *            跟踪信息
     */
    public void appendMsg(String msg) {
        trace += msg;
    }

    /**
     * 返回跟踪信息
     * 
     * @return String
     */
    public String getTrace() {
        return trace;
    }

    /**
     * 打印原发错误信息
     */
    public void printDebug() {
        this.errOri.printStackTrace();
    }

    private void writeSysException() {
        logger.error("系统错误编码：" + this.errId);
        logger.error("系统错误信息：" + this.errMsg);
    }

}
